package br.com.documentos.model.entity;

import static br.com.documentos.model.util.ValidationUtil.CAMPO_OBRIGATORIO;
import static br.com.documentos.model.util.ValidationUtil.EMAIL_INVALIDO;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Index;
import org.hibernate.validator.constraints.Email;

import br.com.documentos.model.entity.enuns.StatusUsuario;
import br.com.documentos.model.util.CalendarUtil;

@Entity
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	public static final Integer LIMITE_TENTATIVA_ACESSO = 3;
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
	private Long id;
	
	@Size(min=1, max=50, message=CAMPO_OBRIGATORIO)
	@Email(message=EMAIL_INVALIDO)
	@Index(name = "email_usr_index")
	@Column(unique=true)
	private String email;
	
	@Size(min=1, max=70, message=CAMPO_OBRIGATORIO)
	private String nome;
	
	@Size(min=1, max=50, message=CAMPO_OBRIGATORIO)
	private String senha;

	private Calendar dataCadastro;
	
	private StatusUsuario status;
	
	private String ip;
	
	@OneToMany(mappedBy="usuario", cascade=CascadeType.ALL)
	private List<HistorioAcesso> historicoAcesso = new ArrayList<HistorioAcesso>();
		
	public boolean limiteTentativaAcessoExcedido( String ip , Calendar data )
	{
		data = CalendarUtil.getDataComHorarioZerado(data);
		int numeroAcessosNaoAutorizados = 0;
		
		for( HistorioAcesso historioAcesso : historicoAcesso )
		{
			if( data.equals( CalendarUtil.getDataComHorarioZerado(historioAcesso.getData()) ) && 
				ip.equals(historioAcesso.getIp()) &&
				! historioAcesso.isAcessoAutorizado() ) {
				
				numeroAcessosNaoAutorizados++;
			}
		}
		
		return numeroAcessosNaoAutorizados >= LIMITE_TENTATIVA_ACESSO;
	}
		
	public List<HistorioAcesso> getHistorioAcesso(){
		return historicoAcesso;
	}
	
	public void addHistorioAcesso(Calendar data, String ip, boolean autorizado )
	{
		HistorioAcesso historioAcesso = new HistorioAcesso();
		historioAcesso.setAcessoAutorizado(autorizado);
		historioAcesso.setData(data);
		historioAcesso.setIp(ip);
		historioAcesso.setUsuario(this);
		
		historicoAcesso.add(historioAcesso);
	}

	public void addHistorioAcesso( HistorioAcesso historioAcesso ){
		historicoAcesso.add(historioAcesso);
	}

	public Calendar getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Calendar dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public StatusUsuario getStatus() {
		return status;
	}

	public void setStatus(StatusUsuario status) {
		this.status = status;
	}

	public void ativar() {
		this.status = StatusUsuario.ATIVO;
	}
	
	public boolean isAtivo(){
		return StatusUsuario.ATIVO.equals(status);
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

}
